package demo

/**
  * immutable 定长
  * mutable 变长
  *
  * scala 化简规则 如果方法体{}只有一行代码，则方法体可以省略
  * 匿名函数参数类型可以省略
  * 如果匿名函数的参数列表()只有一个，则参数列数列表可以省略
  */
object ArrayDemo {
  //声明定长数组，并附初始值
  var a1 = Array(1, 2, 3, 4)
  //声明定长数组
  var a2 = new Array[Int](2)

  //声明变长数组
  val a3 = scala.collection.mutable.ArrayBuffer(1, 2, 3)

  //通过下标拿值
  a3.apply(0)
  a3(0)
  //追加元素
  a3.append(4, 5)

  var a4 = Array(2, 3, 5, 4, 1)
  //返回最大值
  var max1 = a4.max
  //返回最小值
  var min1 = a4.min
  //求和
  var sum1 = a4.sum

  //取出集合中前n个元素，并返回到一个新的集合
  val a5 = a4.take(2)
  //取出后n个元素到一个新的集合
  var a6 = a4.takeRight(2)
  //去除前n个元素，返回剩余元素到一个新的集合中
  var a7 = a4.drop(2)
  //去除后n个元素，返回剩余元素到新的集合
  var a8 = a4.dropRight(2)

  //返回集合的头元素，有别于take(1),后者会将取出的元素放入新的集合
  val a9 = a4.head

  //返回集合的尾元素，有别于takeRight(1),后者会将取出的元素放入新的集合
  var a10 = a4.last

  //反转集合元素
  var a11 = a4.reverse

  //数组去重,将去重后的数组返回到新的集合
  var a12 = a4.distinct

  //将集合中所有元素返回为一个字符串
  var a13 = a4.mkString

  //已指定的分隔符分割集合以字符串返回
  var a14 = a4.mkString(",")

  //根据指定的匿名函数实现过滤
  //匿名函数参数类型可以省略
  //如果匿名函数的参数列表()只有一个，则参数列数列表可以省略
  var a15 = a4.filter { num => num % 2 == 0 } //{ (num:Int) => {xxx} }

  var a16 = a4.filter { num => num % 2 == 0 && num > 4 }


  var a17 = Array("tom M 23", "rose F 18", "jim M 30", "jerry M 35")

  //过滤出男性数据 M : 男
  var a18 = a17.filter { str => str.contains("M") }

  //过滤出年龄大于25的人
  val a19 = a17.filter(str => str.split(" ")(2).toInt > 25)

  //判断是否包含年龄小于十八岁的人
  var a20 = a17.exists(x => x.split(" ")(2).toInt < 18)

  //map方法: 映射方法，更具传入的匿名函数，将元素从一个形式映射成另一个形式
  val a21 = a4.map(num => num * 2)

  var a22 = a17.map(x => x.split(" ")(0))

  //统计出最大的年龄值
  var a23 = a17.map(x => x.split(" ")(2).toInt).max

  //计算出男性的平均年龄
  var a24 = a17.filter(x => x.contains("M")).map(item => item.split(" ")(2).toInt)
  val avg = a24.sum / a24.length


  var a25 = a4.reduce((i1, i2) => i1 + i2)

  //计算出a4中元素的阶乘结果
  var a26 = a4.reduce((a, b) => a * b)

  //返回a4中最大值
  val a27 = a4.reduce((a, b) => if (a > b) a else b)

  //对a4降序排序,默认是升序排序，reverse反转为降序排序
  val a28 = a4.sortBy(x => x).reverse

  //要求按照年龄升序排序后的结果
  var a29 = a17.sortBy(x => x.split(" ")(2))

  var a30 = a17.map(x => x.split(" ")(2).toInt).sortBy(x=> -x).take(2)

  var a31 = Array(1,2,4)
  var a32 = Array(2,4,5)

  //取交集
  val a33 = a31.intersect(a32)

  //并集
  a31.union(a32)
  //差集
  a31.diff(a32)


  def main(args: Array[String]): Unit = {
    //println(a27)
    println(a30.foreach(item => println(item)))
  }


}
